/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modules.enderecamento.models.dao;

/**
 *
 * @author Clezio
 */
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import modules.enderecamento.models.dto.GruposAcesso;
import modules.enderecamento.models.dto.GruposAcessosUsuario;
import modules.enderecamento.models.dto.Usuario;
import modules.enderecamento.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
   
 public class UsuarioDAO{  
     
     private SessionFactory sessionFactory;
     
     public UsuarioDAO() throws Exception{
         sessionFactory = HibernateUtil.getSessionFactory();
     }
       
     public void save(Usuario usuario) throws Exception{
         Session session = sessionFactory.openSession();
         Transaction tx = session.beginTransaction();
         if(usuario.getId() > 0){
             Iterator it = retrieve(usuario.getId()).getGruposAcessosUsuarioses().iterator();
            while (it.hasNext()) {
                GruposAcessosUsuario gruposAcessoUsuario = (GruposAcessosUsuario) it.next();
                session.delete(gruposAcessoUsuario);
            }
            session.update(usuario);
         }else{
            session.save(usuario);
         }
         session.flush();
         tx.commit();
         session.close();  
     }  
       
     public java.util.List getList(String condicao) throws Exception{  
         Session session = sessionFactory.openSession();
         Query query = session.createQuery(condicao);
         List usuarios = query.list();
         session.flush();  
         session.close();  
         return usuarios;
     }  
       
     public Usuario retrieve(Integer pk) throws Exception{
         Session session = sessionFactory.openSession();
         Usuario usuario = (Usuario)session.load(Usuario.class, pk);
         Usuario usuarioDTO = mountDto(usuario);
         session.flush();
         session.close();  
         return usuarioDTO;
     }  
       
     public void delete(Usuario Usuario) throws Exception{
         Session session = sessionFactory.openSession();
         Transaction tx = session.beginTransaction();
         session.delete(Usuario);
         session.flush();
         tx.commit();
         session.close();  
     }

    private Usuario mountDto(Usuario usuario) {
        Usuario usuarioDTO = new Usuario();
        usuarioDTO.setId(usuario.getId());
        usuarioDTO.setLogin(usuario.getLogin());
        usuarioDTO.setSenha(usuario.getSenha());
        usuarioDTO.setNome(usuario.getNome());
        usuarioDTO.setAtivo(usuario.isAtivo());
        usuarioDTO.setLogses(usuario.getLogses());
        usuarioDTO.setCargo(usuario.getCargo());
        usuarioDTO.setGruposAcessosUsuarioses(new HashSet(usuario.getGruposAcessosUsuarioses()));
        return usuarioDTO;
    }

    public List<Usuario> find(Usuario usuario){
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(Usuario.class);
        if(usuario.getLogin() != null){
            criteria.add( Restrictions.eq( "login", usuario.getLogin() ) );
        }
        if(usuario.getSenha() != null){
            criteria.add( Restrictions.eq( "senha", usuario.getSenha() ) );
        }
        List<Usuario> listRetorno = new ArrayList<Usuario>(criteria.list());
        session.close();
        return listRetorno;
    }
}
